/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#include "TriangleWaveform.h"

#include "Utils.h"
#include <cmath>

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

using namespace std;
using namespace SimInterface;


TriangleWaveform::TriangleWaveform(ISimulator& sim,
                                   double amplitude, double period,
                                   double offset, double phase)
    : WaveformBase(sim, "Triangle", "triangle", amplitude, period, offset, phase)
{
}

double TriangleWaveform::getNextValue()
{
    double currentTime = getCurrentTime();

    // Wartość znormalizowana fazy sygnału.
    // Przedziałowi <0; T> odpowiada <0; 1>, z uwzględnieniem fazy.
    double n = currentTime / getPeriod() + getPhase();
    double ratio = n - floor(n);

    double gain = getGain();
    double offset = getOffset();

    if(ratio < 0.25)
        return 4*gain*ratio + offset;
    else if(ratio < 0.75)
        return 2*gain*(1 - 2*ratio) + offset;
    else
        return 4*gain*(ratio - 1) + offset;
}

}
}
